"""
混合AI服务模块
提供智能的服务调度和选择功能
"""

import logging
from .base_service import BaseAIService
from .ocr_service import VolcanoOCRService
from .cloud_services import DoubaoService
from .local_services import LMStudioService

logger = logging.getLogger(__name__)

class HybridAIService(BaseAIService):
    """
    混合AI服务：智能选择OCR、LMStudio或Doubao服务
    策略：
    1. 先用OCR快速识别图片
    2. 如果OCR检测到文字(>1个字符)或国旗/国徽，则使用AI模型深入分析
    3. 如果不符合上述条件，直接返回OCR结果，不使用AI模型
    """

    def __init__(self, config: dict):
        self.config = config
        self.active_model = config.get('active_model', 'lmstudio')

        # 初始化OCR服务（始终需要）
        self.ocr_service = VolcanoOCRService(config.get('volcengine', {}))

        # 根据配置初始化对应的AI服务
        if self.active_model == 'lmstudio':
            self.ai_service = LMStudioService(config.get('lmstudio', {}))
            logger.info("[混合AI服务] 初始化完成，使用 LMStudio")
        elif self.active_model == 'doubao':
            self.ai_service = DoubaoService(config.get('doubao', {}))
            logger.info("[混合AI服务] 初始化完成，使用 Doubao")
        elif self.active_model == 'volcano_ocr':
            self.ai_service = VolcanoOCRService(config.get('volcengine', {}))
            logger.info("[混合AI服务] 初始化完成，使用 Volcano OCR")
        else:
            # 默认使用LMStudio
            self.ai_service = LMStudioService(config.get('lmstudio', {}))
            logger.info(f"[混合AI服务] 初始化完成，默认使用 LMStudio (未知模型: {self.active_model})")

        # 配置参数
        self.enable_fallback = config.get('app_settings', {}).get('hybrid_enable_fallback', True)

    def _should_use_ai_model(self, ocr_result: str) -> tuple[bool, str]:
        """
        判断是否需要使用AI模型进行进一步分析

        Args:
            ocr_result: OCR识别结果

        Returns:
            tuple[bool, str]: (是否需要AI分析, 原因)
        """
        ocr_text = ocr_result.strip()

        # 检查是否有文字内容（超过1个字符）
        if len(ocr_text) > 1:
            return True, f"检测到文字内容({len(ocr_text)}个字符)"

        # 检查是否包含国旗相关关键词
        flag_keywords = ['国旗', '五星红旗', 'flag', '国徽', '党徽', '锤子镰刀']
        for keyword in flag_keywords:
            if keyword in ocr_text:
                return True, f"检测到敏感标识: {keyword}"

        # 检查是否包含政治相关内容
        political_keywords = ['习近平', '毛泽东', '共产党', '人民政府', '中央人民政府']
        for keyword in political_keywords:
            if keyword in ocr_text:
                return True, f"检测到政治相关内容: {keyword}"

        return False, "仅包含少量文字或无敏感内容"

    async def analyze(self, image_bytes: bytes) -> str:
        """
        智能混合分析策略：
        1. 先用OCR快速识别图片
        2. 根据OCR结果判断是否需要AI模型深入分析
        3. 只有在需要时才调用AI模型
        """
        try:
            # 步骤1: OCR快速识别
            logger.info("[混合分析] 步骤1: 开始OCR快速识别")
            ocr_result = await self.ocr_service.analyze(image_bytes)
            ocr_text_length = len(ocr_result.strip())

            logger.info(f"[混合分析] OCR识别完成，获得 {ocr_text_length} 个字符")
            logger.info(f"[混合分析] OCR结果: {ocr_result[:100]}{'...' if len(ocr_result) > 100 else ''}")

            # 步骤2: 判断是否需要AI模型分析
            should_use_ai, reason = self._should_use_ai_model(ocr_result)

            if should_use_ai:
                logger.info(f"[混合分析] 步骤2: 检测到需要AI分析的内容 - {reason}")
                logger.info(f"[混合分析] 步骤3: 开始使用 {self.active_model} 进行深入分析")

                # 使用AI模型进行深入分析
                try:
                    ai_result = await self.ai_service.analyze(image_bytes)
                    logger.info(f"[混合分析] AI分析完成，返回 {len(ai_result)} 个字符的结果")

                    # 合并OCR和AI的结果
                    if ai_result and ocr_result:
                        combined_result = f"{ai_result} [OCR文字: {ocr_result}]"
                        logger.info(f"[混合分析] 结果合并完成，总长度: {len(combined_result)} 个字符")
                        return combined_result
                    elif ai_result:
                        return ai_result
                    else:
                        return ocr_result

                except Exception as e:
                    logger.error(f"[混合分析] AI模型分析失败: {e}")
                    if self.enable_fallback:
                        logger.info("[混合分析] 返回OCR结果作为备选")
                        return ocr_result
                    else:
                        raise e

            else:
                logger.info(f"[混合分析] 步骤2: {reason}，跳过AI分析，直接返回OCR结果")
                return ocr_result

        except Exception as e:
            logger.error(f"[混合分析] OCR识别失败: {e}")
            raise e

    def get_service_info(self) -> dict:
        """获取混合服务信息"""
        base_info = super().get_service_info()
        base_info.update({
            'service_type': 'hybrid',
            'active_model': self.active_model,
            'ocr_service': self.ocr_service.get_service_info(),
            'ai_service': self.ai_service.get_service_info(),
            'enable_fallback': self.enable_fallback
        })
        return base_info
